// Au chargement
$(document).observe('dom:loaded', function() {
  // Ajout d'un utilisateur avec le menu déroulant
  $('add-payer', 'add-participant').invoke('observe', 'change', add_user_on_change_select)
  
  // Suppression d'un utilisateur dans la liste (on ajoute qu'un seul observeur par liste)
  $('payers-list', 'participants-list').invoke('observe', 'click', remove_user_on_click)
  
  // Ajoute des observeurs pour chacher/montrer le montant par defaut
  $$('input.amount').each(function(input) {
    input.observe('blur', update_default_amounts)
    input.observe('focus', focus_user_input)
  })
  
  update_default_amounts()

})

// Quand on entre dans un champ, cacher le par defaut
function focus_user_input(e) {
  e.element().previous('label').down('.default-amount').hide()
}

// Retourne le montant total payé
function total_paid() {
  // Somme des value des #payers-list input
  return $('payers-list').select('input').inject(0, function(acc, input) {
    return acc + floatInput(input)
  })
}

// Retourne le montant total de participation
function total_participated() {
  // Somme des value des #participants-list input
  return $('participants-list').select('input.amount').inject(0, function(acc, input) {
    return acc + floatInput(input)
  })
}

// Mets a jour les valeurs par defaut pour les participants non-remplis
function update_default_amounts() {
  var participants = $('participants')
  var participant_inputs = participants.select('input.amount')

  // Trouve tous les champs que l'on considère vide
  var empty_inputs = participant_inputs.select(function(input) {
    return input.value == ''
  })

  // Calcul du restant
  var difference = total_paid() - total_participated()
  var rest = difference / empty_inputs.size()
  var show_rest = rest
  
  if (isNaN(rest) || rest == Infinity)
    show_rest = 0;

  // on reremplis les default_amount des champs_vides
  participants.select('.default-amount').invoke('hide')
  empty_inputs.each(function(input) {
    var li = $(input).up('li')
    li.down('.default-amount').show().update(show_rest)
    li.down('input[type=hidden]').value = show_rest
  })
}


// Récupère le montant positif d'un input donné
function floatInput(input) {
  var value = parseFloat($(input).getValue().strip().gsub(/,/, '.'), 10)
  return (isNaN(value) || value < 0) ? 0 : value
}


// Ajoute un user dans la liste de payeurs ou de participants lorsque l'on choisit quelqu'un dans un des select
function add_user_on_change_select(e) {
  // Retrouve le <select> invoqué
  var adder = $(e).element()
  var ul = adder.up('p').next('ul') // Renvoie le ul des payeurs ou participants
  var participant_or_payer = adder.id.replace('add-', '') // Renvoie 'payer' ou 'participant'

  // Récupère id et nom selectionnés  dans le select
  var user_id = adder[adder.selectedIndex].value
  var user_name = adder[adder.selectedIndex].innerHTML
  adder.selectedIndex = 0 // Remets le select à vide

  // Si l'utilisateur n'existe pas déjà, le crée et insère sa ligne
  if (!$(participant_or_payer+'-'+user_id))
    ul.insert(create_user_line(participant_or_payer, user_id, user_name))

  update_default_amounts()
}


// Crée une <li> utilisateur
// Prends comme arguments:
//   - participant_or_payer : 'participant' ou 'payer'
//   - user_id : identifiant unique d'un utilisateur
//   - user_name
function create_user_line(participant_or_payer, user_id, user_name) {
  var input_id = participant_or_payer+'-'+user_id
  var input_name = participant_or_payer+'s['+user_id+']'
  var input_default_name = 'default-' input_name

  var li = new Element('li')
      .insert(
        new Element('label', { 'for': input_id })
          .insert(new Element('span', { 'class':'user-name'}).insert(user_name))
          .insert(new Element('span', { 'class': 'default-amount' }))
      )
      .insert(
        new Element('input', { 'class': 'amount', size: 3,
                               'id': input_id, 'name': input_name })
          .observe('blur', update_default_amounts)
          .observe('focus', focus_user_input)
      )
      .insert(
        new Element('input', { 'type': 'hidden', 'name': input_default_name })
      )
      .insert(new Element('span', { 'class': 'currency' }).update('€'))
      .insert(
        new Element('a', { href: '#', 'class': 'remove', title:'Retirer' }).insert(
          new Element('img', { src: 'delete.png', alt:'supprimer' })
        )
      )
  return li
}

// Retire un utilisateur d'une liste
// Appellé lorsque l'on clique sur le <a class="remove"><img></a>
function remove_user_on_click(e) {
  var elem = $(e).target
  if (elem.up('a.remove') || elem.match('a.remove')) {
    elem.up('li').remove()
	update_default_amounts()
    $(e).stop();
  }
}


